package com.qqt.csr.archive.batch.task.etl.transformer;

import com.qqt.csr.archive.assembler.ConversationArchiveAssembler;
import com.qqt.csr.archive.batch.task.context.ConversationArchiveTaskContext;
import com.qqt.csr.archive.entity.writer.ArchiveConversation;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.stereotype.Component;

import java.util.Optional;

/**
 * @Author: yang hao
 * @Date: 2024/11/20 10:20
 * @Description: 会话归档 处理器
 **/
@Slf4j
@Component
public class ConversationArchiveProcessor implements ItemProcessor<ConversationArchiveTaskContext, ArchiveConversation> {

    /**
     * 处理
     * @param context {@link ConversationArchiveTaskContext} 会话归档任务上下文
     * @return {@link ArchiveConversation} 归档会话
     */
    @Override
    public ArchiveConversation process(@NonNull ConversationArchiveTaskContext context) throws Exception {
        // 根据来源类型进行转换
        switch (context.getSource()) {
            // 人工客服会话
            case ARTIFICIAL: artificialProcess(context); break;
            // 智能客服会话
            case SMART: smartProcess(context); break;
            // 不支持的来源类型
            default: throw new IllegalArgumentException("不支持的来源类型" + context.getSource());
        }
        return context.getConversation();
    }

    /**
     * 人工客服会话转换
     * @param context {@link ConversationArchiveTaskContext} 任务上下文
     */
    private void artificialProcess(ConversationArchiveTaskContext context) {
        log.debug("开始执行人工客服会话转换, 上下文:{}", context.toJsonString());
        ArchiveConversation conversation = ArchiveConversation.builder().build();
        // 填充人工客服会话数据
        ConversationArchiveAssembler.fill(conversation, context.getArtificialConversation());
        // 填充渠道数据
        ConversationArchiveAssembler.fill(conversation, context.getChannel());
        // 填充技能组数据
        ConversationArchiveAssembler.fill(conversation, context.getArtificialConversation().getExt());
        // 填充访客数据
        ConversationArchiveAssembler.fill(conversation, context.getUserAccount());
        // 填充客服数据
        ConversationArchiveAssembler.fill(conversation, context.getCsAccount(), context.getSysUser());
        // 规整会话额外字段
        ConversationArchiveAssembler.tidyUp(conversation, context.getArtificialConversation());
        context.setConversation(conversation);
        log.debug("结束执行人工客服会话转换, 上下文:{}", context.toJsonString());
    }

    /**
     * 智能客服会话转换
     * @param context {@link ConversationArchiveTaskContext} 任务上下文
     */
    private void smartProcess(ConversationArchiveTaskContext context) {
        log.debug("开始执行智能客服会话转换, 上下文:{}", context.toJsonString());
        // 填充智能客服会话数据
        ArchiveConversation conversation = ArchiveConversation.builder().build();
        ConversationArchiveAssembler.fill(conversation, context.getSmartConversation());
        // 填充访客/机器人账号数据
        Optional.ofNullable(context.getUserAccount()).ifPresent(account -> ConversationArchiveAssembler.fill(conversation, account));
        Optional.ofNullable(context.getCsAccount()).ifPresent(account -> ConversationArchiveAssembler.fillRobot(conversation, account));
        // 规整会话额外字段
        ConversationArchiveAssembler.tidyUp(conversation, context.getSmartConversation());
        context.setConversation(conversation);
        log.debug("结束执行智能客服会话转换, 上下文:{}", context.toJsonString());
    }
}
